内联函数只是对编译器的请求,编译器将内联函数的完整主体插入代码中使用该函数的每个位置。但是编译器如何决定是否应该插入它呢?它使用哪种算法/机制来决定?谢谢,纳文 最佳答案 一些共同点:编译器选项(调试构建通常不内联,大多数编译器都有选项来覆盖内联声明以尝试内联全部或不内联)合适的调用约定(例如可变参数函数通常不是内联的)适合内联:取决于函数的大小、函数的调用频率、通过内联获得的yield以及优化设置(速度与代码大小)。通常,小函数最有好处,但如果只调用一次大函数,则可能会被内联内联调用深度和递归设置第三个可能是您问题的核心,但这实际
根据标准,外部内联函数在所有翻译单元中必须具有相同的地址。这是如何在编译器中实现的?我的意思是当我编译一些翻译单元时,我不知道其他TU会是什么样子。那么我怎样才能在所有地方使用相同的地址呢? 最佳答案 这取决于实现,但通常由链接器解决。每个编译的翻译单元将生成一个包含函数拷贝的目标文件,以某种方式标记,以便链接器知道它应该期望(并接受)拷贝。链接器将包含其中一个,丢弃其他,并解析对该函数的任何引用。 关于c++-外部内联函数在所有翻译单元中必须具有相同的地址。这到底是如何实现的?,我们在
这是我的代码:voidGraph::PutPixel(DWORDx,DWORDy,DWORDc){__asm{MovEax,yMovEbx,_widthMulEbxAddEax,xShlEax,2//MultiplybyfourAddEax,_bufferMovEdi,EaxMovEax,cStosD}}其中_buffer和_width是Graph类成员:private:DWORD_width;DWORD*_buffer;它不起作用;我从两个变量中得到0值,但实际上它们还有一些其他值。我可以通过将类变量复制到局部变量并使用它们来修复它:voidGraph::PutPixel(DWORD
如果我将函数设为内联,它是否会将其链接更改为内部链接?例如:我在两个文件中使用或调用内联函数:file1.cpp//functiondefinitioninlinevoidfoo(){}file2.cpp//functiondefinitioninlinevoidfoo(){}为什么我需要在每个文件中定义内联函数才能调用它?我得到一个内部链接?如果我使用staticinline会怎样? 最佳答案 IfImakeafunctioninlinedoesitchangeitslinkagetointernallinkage?不,将其内联并
如果我不将函数f声明为内联。如下:嗯:Xf(Yy);A.cpp:Xf(Yy){...}然后在不同的翻译单元中:B.cpp:#include"A.h"Zg(Ww){......f(...)......}然后我用gcc4.6编译A.o和B.o这两个翻译单元,然后也通过gcc链接它们。(也许对两个步骤都使用-O3)gcc会考虑在链接时内联函数以提高性能吗?还是为时已晚?在一次代码审查中,有人建议我不应该将我的函数声明为内联,因为编译器比我更了解何时内联。我一直觉得除非函数在header中定义,否则编译器没有内联它的选项。(如果C模式、C++模式或gnu++0x模式的答案不同,请同时指出)
在什么情况下,内联函数不再是内联函数,而是充当任何其他函数? 最佳答案 神话:inline只是一个建议,编译器可能会或可能不会遵守。一个好的编译器无论如何都会做需要做的事情。真相:inline通常向实现表明在调用点对函数体的内联替换优于通常的函数调用机制。不需要实现在调用点执行此内联替换;然而,即使省略了这个inline替换,inline的其他规则(尤其是w.r.tOneDefinitionRule)也会遵循。UnderWhatconditionaninlinefunctionceasestobeaninlinefunctionan
在这个答案中https://stackoverflow.com/a/4193698/738811上面写着“默认情况下,内联函数具有外部链接”。但是,默认情况下不可能链接到内联的内容。那么说内联函数具有外部链接有什么意义呢? 最佳答案 名称的链接与其定义的位置或方式无关,仅与名称可用于指代特定对象或函数的位置有关。声明一个函数内联并不强制它被内联;它只是放宽了一个定义规则,以允许在使用它的每个翻译单元中都有一个定义(并且在每个调用它的翻译单元中都需要一个定义),以便更容易内联。如果编译器决定不内联对它的特定调用,或者如果您获取它的地址
我看到一些inlineconst变量在visualstudio2017中被初始化(和销毁)3次的示例。这是链接器的错误吗?或者这应该以其他方式发生?链接器Comdat折叠设置为关闭。示例代码:#pragmaoncestructA{A(){staticintcount=0;++count;ASSERT(count==1);}~A(){}};inlineconstAa=A();在我的解决方案中,我有两次触发断言(一个构造函数被调用了3次)。检查调用堆栈显示所有调用堆栈都是相同的,并且所有调用都来自a()的动态初始化程序。现在我知道这个类没有用在解决方案的其他部分,因为我创建它只是为了调查这
我喜欢在列表上编写函数检查。为此,我通常编写如下函数:inlineboolgood_strings(conststd::vector&items){for(iinitems){if(notis_good(i))returnfalse;}returntrue;}然后我可以像if(all_good({"a","b","c","d","e"})){...}这样写,它看起来非常好。当您对几个项目的支票像这样变大时,这很适合使用:if(is_good("a")andis_good("b")and/*that'stoomuch,man*/is_good("c")){...}但我担心我正在使用的容器
我正在尝试做这样的事情:structSomeStruct{constchar*bytes;constchar*desc;};SomeStructexample={{0x10,0x11,0x12,0x13},"10-13"};为什么这不起作用? 最佳答案 可能是因为{0x10,0x11,0x12,0x13}是一个char数组,而不是指向char的指针。试试SomeStructexample={"\x10\x11\x12\x13","10-13"};代替。 关于c++-如何在结构内联中分配字